Fix bug #9229 with cursor positioning on display strings.
authorEli Zaretskii <eliz@gnu.org>
Fri, 5 Aug 2011 10:32:06 +0000 (13:32 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 5 Aug 2011 10:32:06 +0000 (13:32 +0300)
 src/xdisp.c (set_cursor_from_row): Prefer the candidate glyph that
 came from a string character with a `cursor' property.

src/ChangeLog
src/xdisp.c

index d2286b6bbd5b1b43d34f1d8e56ee219ab944dd5f..2cad6407b6d745155e531bb807b795858b29713c 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-05  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (set_cursor_from_row): Prefer the candidate glyph that
+       came from a string character with a `cursor' property.  (Bug#9229)
+
 2011-08-04  Jan Djärv  <jan.h.d@swipnet.se>
 
        * Makefile.in (LIB_PTHREAD): New variable.
index d1598e5ed40f970b907e4c65be5f4bd1877e5d6b..59a6bc3f9061aa19cae4072377284253411d608b 100644 (file)
@@ -13706,14 +13706,12 @@ set_cursor_from_row (struct window *w, struct glyph_row *row,
       w->cursor.vpos >= 0
       /* that candidate is not the row we are processing */
       && MATRIX_ROW (matrix, w->cursor.vpos) != row
-      /* the row we are processing is part of a continued line */
-      && (row->continued_p || MATRIX_ROW_CONTINUATION_LINE_P (row))
       /* Make sure cursor.vpos specifies a row whose start and end
         charpos occlude point.  This is because some callers of this
         function leave cursor.vpos at the row where the cursor was
         displayed during the last redisplay cycle.  */
       && MATRIX_ROW_START_CHARPOS (MATRIX_ROW (matrix, w->cursor.vpos)) <= pt_old
-      && pt_old < MATRIX_ROW_END_CHARPOS (MATRIX_ROW (matrix, w->cursor.vpos)))
+      && pt_old <= MATRIX_ROW_END_CHARPOS (MATRIX_ROW (matrix, w->cursor.vpos)))
     {
       struct glyph *g1 =
        MATRIX_ROW_GLYPH_START (matrix, w->cursor.vpos) + w->cursor.hpos;
@@ -13722,15 +13720,20 @@ set_cursor_from_row (struct window *w, struct glyph_row *row,
       if (!(row->reversed_p ? glyph > glyphs_end : glyph < glyphs_end))
        return 0;
       /* Keep the candidate whose buffer position is the closest to
-        point.  */
+        point or has the `cursor' property.  */
       if (/* previous candidate is a glyph in TEXT_AREA of that row */
          w->cursor.hpos >= 0
          && w->cursor.hpos < MATRIX_ROW_USED (matrix, w->cursor.vpos)
-         && BUFFERP (g1->object)
-         && (g1->charpos == pt_old /* an exact match always wins */
-             || (BUFFERP (glyph->object)
-                 && eabs (g1->charpos - pt_old)
-                  < eabs (glyph->charpos - pt_old))))
+         && ((BUFFERP (g1->object)
+              && (g1->charpos == pt_old /* an exact match always wins */
+                  || (BUFFERP (glyph->object)
+                      && eabs (g1->charpos - pt_old)
+                      < eabs (glyph->charpos - pt_old))))
+             /* previous candidate is a glyph from a string that has
+                a non-nil `cursor' property */
+             || (STRINGP (g1->object)
+                 && !NILP (Fget_char_property (make_number (g1->charpos),
+                                               Qcursor, g1->object)))))
        return 0;
       /* If this candidate gives an exact match, use that.  */
       if (!(BUFFERP (glyph->object) && glyph->charpos == pt_old)